/*-------------------------------------------------------------------------
 *
 * plpython_system.h - 包含 Python 的系统头文件
 *
 * 我们将其分离为一个单独的头文件，以精确控制 "system_header" pragma 的作用域。这里不应放置任何与 Postgres 相关的声明。然而，我们确实包括一些内容，以防止我们的代码与 Python 之间发生冲突。
 *
 * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/pl/plpython/plpython_system.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef PLPYTHON_SYSTEM_H
#define PLPYTHON_SYSTEM_H

/*
 * 新版本的 Python 头文件在我们的首选编译器标志下触发了很多警告
 * （至少已知 -Wdeclaration-after-statement 是有问题的）。system_header 语句如果被支持的话，可以隐藏
 * 本文件其他部分的警告。
 */
#ifdef HAVE_PRAGMA_GCC_SYSTEM_HEADER
#pragma GCC system_header
#endif

/*
 * 取消在 Python 头文件中重新定义的一些东西。它们在 PL/Python 代码中没有使用，
 * 并且所有 PostgreSQL 头文件应该提前包含，所以这应该是相当安全的。
 */
#undef _POSIX_C_SOURCE
#undef _XOPEN_SOURCE

/*
 * 有时 Python 小心翼翼地破坏我们的 *printf 宏。
 * 所以我们在这里取消定义它们，并在完成它的肮脏工作后重新定义它们。
 */
#undef vsnprintf
#undef snprintf
#undef vsprintf
#undef sprintf
#undef vfprintf
#undef fprintf
#undef vprintf
#undef printf

#if defined(_MSC_VER) && defined(_DEBUG)
/* Python 在 VC++ 上使用 #pragma 导入非默认的 libpython 如果
 * _DEBUG 被定义 */
#undef _DEBUG
/* 还要隐藏 errcode，因为我们在 postgres.h 之前加载 Python.h */
#define errcode __msvc_errcode
#include <Python.h>
#undef errcode
#define _DEBUG
#elif defined (_MSC_VER)
#define errcode __msvc_errcode
#include <Python.h>
#undef errcode
#else
#include <Python.h>
#endif

/* 恢复我们的*printf宏...这必须与src/include/port.h匹配 */
#ifdef vsnprintf
#undef vsnprintf
#endif
#ifdef snprintf
#undef snprintf
#endif
#ifdef vsprintf
#undef vsprintf
#endif
#ifdef sprintf
#undef sprintf
#endif
#ifdef vfprintf
#undef vfprintf
#endif
#ifdef fprintf
#undef fprintf
#endif
#ifdef vprintf
#undef vprintf
#endif
#ifdef printf
#undef printf
#endif

#define vsnprintf		pg_vsnprintf
#define snprintf		pg_snprintf
#define vsprintf		pg_vsprintf
#define sprintf			pg_sprintf
#define vfprintf		pg_vfprintf
#define fprintf			pg_fprintf
#define vprintf			pg_vprintf
#define printf(...)		pg_printf(__VA_ARGS__)

#endif							/* PLPYTHON_SYSTEM_H */
